package com.sunrise.estoque.repositorio;

import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import com.sunrise.estoque.repositorio.iface.VendaDao;
import com.sunrise.generico.acesso.DaoService;
import com.sunrise.generico.entidade.Venda;
import com.sunrise.generico.visao.Filtro;

@Repository
public class VendaDaoImpl extends DaoService<Venda> implements VendaDao {

	public List<Venda> listarOrdenado() {
		List<Venda> list = listar(Venda.class);
		Collections.sort(list, new Comparator<Venda>() {

			@Override
			public int compare(Venda o1, Venda o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public List<Venda> search(Venda ex) {
		List<Venda> list =  searchByExample(Venda.class, ex);
		Collections.sort(list, new Comparator<Venda>() {

			@Override
			public int compare(Venda o1, Venda o2) {
				return o1.getNome().compareTo(o2.getNome());
			}
		});
		return list;
	}

	public Venda getById(Long id) {
		return getById(id, Venda.class);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Venda> listarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(Venda.class);
		crit.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE));
		return crit.list();
	}

	
	@SuppressWarnings("unchecked")
	@Override
	public Collection<Venda> buscarPorFiltros(Filtro venda) {
		Criteria crit = getSession().createCriteria(Venda.class);
		
		if(venda.getCodigo() != null && venda.getCodigo() != ""){
			crit.add(Restrictions.eq("id", new Long(venda.getCodigo())));
		}
		
		if(venda.getStatus() != null){
			crit.add(Restrictions.eq("statusVenda", venda.getStatus()));
		}
		
		if(venda.getNomeProduto() != null && venda.getNomeProduto() != ""){
			crit.createAlias("vendaProdutos", "vProduto");
			crit.createAlias("vProduto.produto", "prod");
			crit.add(Restrictions.ilike("prod.nome", venda.getNomeProduto(), MatchMode.ANYWHERE));
		}
		
		return crit.list();
	}
	
	@Override
	public Venda buscarPorNome(String nome) {
		Criteria crit = getSession().createCriteria(Venda.class);
		crit.add(Restrictions.eq("nome", nome).ignoreCase());
		return (Venda) crit.uniqueResult();
	}

}
